﻿/*840. 模拟散列表

维护一个集合，支持如下几种操作：
I x，插入一个数 x；
Q x，询问数 x 是否在集合中出现过；
现在要进行 N 次操作，对于每个询问操作输出对应的结果。

输入格式
第一行包含整数 N，表示操作数量。
接下来 N 行，每行包含一个操作指令，操作指令为 I x，Q x 中的一种。

输出格式
对于每个询问指令 Q x，输出一个询问结果，如果 x 在集合中出现过，则输出 Yes，否则输出 No。
每个结果占一行。

数据范围
1≤N≤105，109≤x≤109
输入样例：
5
I 1
I 2
I 3
Q 2
Q 5
输出样例：
Yes
No*/

#include<iostream>
#include<cstring>
using namespace std;
const int N = 100003;//100010;
int h[N], e[N], ne[N], idx;//链

//拉链法:插入、查找常用，删除不常用
void insert(int x)
{
    int k = (x % N + N) % N;//先找到在h[]中的位置
    
    //(x%N+N)%N:保证余数为正数
    e[idx] = x;//然后再在链表内进行插入
    ne[idx] = h[k];
    h[k] = idx++;
}
bool find(int x) //bool
{
    int k = (x % N + N) % N;
    //遍历这条链表
    for (int i = h[k]; i != -1; i = ne[i])//最后一个节点i=-1？
    {
        if (e[i] == x)
            return true;
        //else return false;
    }
    return false;
}
int main()
{
    /* bool flag;
    for(int i=2;i<=N;i++)
    {
        flag=true;
        for(int j=2;j*j<=i;j++)//
            if(i%j==0)
            {
                flag=false;
                break;
            }
        if(flag)    cout<<i<<endl; }*/
    int n, x;
    cin >> n;
    memset(h, -1, sizeof h); //这个老忘记
    while (n--)
    {
        char op[2];
        scanf("%s", op);//不需要&op
        if (op[0] == 'I') //还可以写成*op,=op[0]
        {
            cin >> x;
            insert(x);
        }
        else//Q
        {
            cin >> x;
            if (find(x)) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

/*总结：
1.memset(h, -1, sizeof h); //这个老忘记
2.for(...){
    if(...) return true;
  return false;不是if完就else,没找到就继续找，找不到退出循环再false*/